home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / powervww / pvtable.cpp < prev    next >
C/C++ Source or Header  |  1998-01-05  |  25KB  |  1,087 lines

  1. //  ____________________________________________________
  2. // |                                                    |
  3. // |  Project:     POWER VIEW INTERFACE                 |
  4. // |  File:        PVTABLE.CPP                          |
  5. // |  Compiler:    WPP386 (10.6)                        |
  6. // |                                                    |
  7. // |  Subject:     Tables support implementation        |
  8. // |                                                    |
  9. // |  Author:      Emil Dotchevski                      |
  10. // |____________________________________________________|
  11. //
  12. // E-mail: zajo@geocities.com
  13. // URL:    http://www.geocities.com/SiliconValley/Bay/3577
  14.  
  15. #define uses_stdio
  16. #define uses_string
  17. #define uses_icons
  18. #define uses_check
  19. #define uses_dc
  20. #define uses_desk
  21. #define uses_dialog
  22. #define uses_label
  23. #define uses_list
  24. #define uses_system
  25. #define uses_stddlg
  26. #define uses_table
  27. #define uses_win
  28.  
  29. #define DECLARE_PVTABLE_H
  30. #include "PVuses.h"
  31. #undef  DECLARE_PVTABLE_H
  32.  
  33. #define cmTABLE_UPDATE    cmUSER99
  34.  
  35. static Ttable_data *data_ptr;
  36. static boolean dialog_table_fl = 0;
  37.  
  38.  
  39. //Ttable_iterator publics:
  40.  
  41. Ttable_iterator::Ttable_iterator( int _xl, int _yl ):
  42.   Titem( _xl, _yl ),
  43.   h_beg_print( _h_beg_print ),
  44.   h_size( _h_size ),
  45.   h_count( _h_count ),
  46.   h_current( _h_current ),
  47.   v_beg_print( _v_beg_print ),
  48.   v_count( _v_count ),
  49.   v_current( _v_current )
  50. {
  51.   grow_mode = gmGROW_BOTH;
  52.   h_beg_print=h_count=h_size=h_current=v_beg_print=v_count=v_current=hsel_org=vsel_org=0;
  53. #ifndef NOMOUSE
  54.   set_events_mask( evMOUSE_REP, 1 );
  55. #endif
  56.   set_flags( tfDOUBLE_CLICK_OK|tfWHOLE_LINES, 1 );
  57. }
  58.  
  59. Ttable_iterator::Ttable_iterator( int _xl, int _yl,
  60.                                   uint &hsize,
  61.                                   uint &hbeg_print, uint &hcount, uint &hcurrent,
  62.                                   uint &vbeg_print, uint &vcount, uint &vcurrent ):
  63.   Titem( _xl, _yl ),
  64.   h_beg_print( hbeg_print ),
  65.   h_size( hsize ),
  66.   h_count( hcount ),
  67.   h_current( hcurrent ),
  68.   v_beg_print( vbeg_print ),
  69.   v_count( vcount ),
  70.   v_current( vcurrent )
  71. {
  72.   grow_mode = gmGROW_BOTH;
  73.   h_beg_print=h_count=h_size=h_current=v_beg_print=v_count=v_current=hsel_org=vsel_org=0;
  74. #ifndef NOMOUSE
  75.   set_events_mask( evMOUSE_REP, 1 );
  76. #endif
  77.   set_flags( tfDOUBLE_CLICK_OK|tfWHOLE_LINES, 1 );
  78. }
  79.  
  80. void Ttable_iterator::redraw( void )
  81. {
  82.   Titem::redraw();
  83.   if( owner != NULL ) owner->redraw();
  84. }
  85.  
  86. void Ttable_iterator::set_title( char *title )
  87. {
  88.   if( ( owner == NULL ) || ( owner->owner == NULL ) ) return;
  89.   ((Twindow *) owner->owner)->set_title( title );
  90. #ifdef TABLEINFO
  91.   if( !owner->flags(tfDIALOG) && current_table==owner )
  92.     ((Twindow *) table_info->owner)->set_title( title );
  93. #endif
  94. }
  95.  
  96. void Ttable_iterator::left( void )
  97. {
  98.   if( !h_current ) return;
  99.   h_current--;
  100.   uint n=0,w=0;
  101.   for( Ttable_data *d=data;
  102.        d!=NULL && n<h_current && w<h_beg_print;
  103.        n++,w+=d->width+1,d=d->nextc );
  104.   if( w<h_beg_print ) h_beg_print -= h_beg_print-w;
  105. }
  106.  
  107. void Ttable_iterator::right( void )
  108. {
  109.   if( h_current>=h_count-1 ) return;
  110.   h_current++;
  111.   int n=0,w=0;
  112.   for( Ttable_data *d=data;
  113.        d!=NULL && n<=h_current;
  114.        n++,w+=d->width+1,d=d->nextc );
  115.   w -= xl+1;
  116.   if( w<0 ) return;
  117.   if( h_beg_print<w ) h_beg_print += w-h_beg_print;
  118. }
  119.  
  120. void Ttable_iterator::up( void )
  121. {
  122.   cursor_up_left( v_current, v_beg_print, yl, 2 );
  123. }
  124.  
  125. void Ttable_iterator::down( void )
  126. {
  127.   cursor_down_right( v_current, v_beg_print, yl, v_count, 2 );
  128. }
  129.  
  130. void Ttable_iterator::top( void )
  131. {
  132.   cursor_top_home( v_current, v_beg_print );
  133. }
  134.  
  135. void Ttable_iterator::bottom( void )
  136. {
  137.   cursor_bottom_end( v_current, v_beg_print, yl, v_count );
  138. }
  139.  
  140. void Ttable_iterator::at( uint i )
  141. {
  142.   cursor_at( i, v_current, v_beg_print, yl, v_count );
  143. }
  144.  
  145. void Ttable_iterator::update_commands( void )
  146. {
  147. }
  148.  
  149. void Ttable_iterator::pgup( void )
  150. {
  151.   for( uint i = 1; i < yl; i++ ) up();
  152. }
  153.  
  154. void Ttable_iterator::pgdn( void )
  155. {
  156.   for( uint i = 1; i < yl; i++ ) down();
  157. }
  158.  
  159. //Ttable_iterator protected:
  160.  
  161. void Ttable_iterator::draw( void )
  162. {
  163.   uint row, col;
  164.   char buf[256];
  165.   Ttable_data *c;
  166.   char ta;
  167.   int l, i, j, rx, ry, rxl, ryl;
  168.   get_clip_rect( rx, ry, rxl, ryl );
  169.   int end=min(yl,ry+ryl);
  170.   rxl+=rx;
  171.   for( i=max(0,ry),row=v_beg_print+i; i<end; i++,row++ )
  172.   {
  173.     c = data;
  174.     col = 0;
  175.     j = -h_beg_print-1;
  176.     while( c != NULL )
  177.     {
  178.       if( j>rxl ) break;
  179.       if( c->where == whTABLE )
  180.       {
  181.         goto_xy( j, i ); j += c->width + 1;
  182.         if( j>=rx )
  183.         {
  184.           txtf( "%c", frame_standard[3] );
  185.           ta = text_attr;
  186.           *buf = 0;
  187.           if( row < v_count )
  188.             fetch( buf, row, col, c->width );
  189.           buf[c->width] = 0;
  190.           if( ( l = c->width - strlen( buf ) ) < 0 ) l = 0;
  191.           if( c->align == atRIGHT ) txtf( "|r%c ", l );
  192.           direct_txt( buf );
  193.           if( c->align == atLEFT ) txtf( "|r%c ", l );
  194.           text_attr = ta;
  195.         }
  196.       }
  197.       c = c->nextc; col++;
  198.     }
  199.     goto_xy( j, i ); txtf( "%c", frame_standard[3] );
  200.   }
  201. }
  202.  
  203. void Ttable_iterator::get_focused( void )
  204. {
  205.   Titem::get_focused();
  206.   update_commands();
  207. }
  208.  
  209. void Ttable_iterator::event_handler( Tevent &ev )
  210. {
  211.   uint vc=v_current, hc=h_current;
  212.   Titem::event_handler( ev );
  213.   if( state( isFOCUSED ) )
  214.     switch( ev.code )
  215.     {
  216.       case evKEY_PRESS:
  217.         switch( ev.ASCII )
  218.         {
  219.           case kUP: case kSHIFT_UP:
  220.             up(); break;
  221.           case kDOWN: case kSHIFT_DOWN:
  222.             down(); break;
  223.           case kPG_UP: case kSHIFT_PG_UP:
  224.             pgup(); break;
  225.           case kPG_DN: case kSHIFT_PG_DN:
  226.             pgdn(); break;
  227.           case kHOME: case kSHIFT_HOME:
  228.             top(); break;
  229.           case kEND: case kSHIFT_END:
  230.             bottom(); break;
  231.           default:
  232.             if( flags(tfWHOLE_LINES) )
  233.               goto not_handled;
  234.             else
  235.               switch( ev.ASCII )
  236.               {
  237.                 case kLEFT: case kSHIFT_LEFT:
  238.                   left(); break;
  239.                 case kRIGHT: case kSHIFT_RIGHT:
  240.                   right(); break;
  241.                 default:
  242.                   goto not_handled;
  243.               }
  244.         }
  245.         if( (hc!=h_current || vc!=v_current) && !(get_shifts()&smSHIFT) )
  246.           hsel_org=h_current, vsel_org=v_current;
  247.         handled( ev ); redraw();
  248.         item_acted = this;
  249.       not_handled:
  250.         break;
  251. #ifndef NOMOUSE
  252.       case evMOUSE_DOWN:
  253.         if( ev.INSIDE )
  254.         {
  255.           uint i, j=(uint) -1;
  256.           uint ih, jh=(uint) -1;
  257.           do
  258.           {
  259.             boolean vinside = (ev.LOCAL_Y>=0 && ev.LOCAL_Y<yl);
  260.             if( vinside || ev.code==evMOUSE_REP )
  261.             {
  262.               if( ev.LOCAL_Y >= 0 ) i = ev.LOCAL_Y; else i = 0;
  263.               i = v_beg_print + i;
  264.               if( !vinside )
  265.               {
  266.                 if( i > v_current ) down(); else up();
  267.                 i = v_current;
  268.               }
  269.               if( i >= v_count ) i = v_count - 1;
  270.               if( j != i )
  271.               {
  272.                 v_current = i;
  273.                 if( ev.code==evMOUSE_DOWN ) vsel_org = v_current;
  274.                 redraw();
  275.               }
  276.               j = v_current;
  277.             }
  278.             if( !flags(tfWHOLE_LINES) )
  279.             {
  280.               boolean hinside = (ev.LOCAL_X>=0 && ev.LOCAL_X<xl);
  281.               if( hinside || ev.code==evMOUSE_REP )
  282.               {
  283.                 if( ev.LOCAL_X >= 0 ) ih = ev.LOCAL_X; else ih = 0;
  284.                 ih = h_beg_print + ih;
  285.                 int xx=0, n=0;
  286.                 for( Ttable_data *d=data; d!=NULL; xx+=d->width+1,d=d->nextc,n++ )
  287.                   if( xx+d->width>ih ) break;
  288.                 ih = n;
  289.                 if( !hinside )
  290.                 {
  291.                   if( ih > h_current ) right(); else left();
  292.                   ih = h_current;
  293.                 }
  294.                 if( ih >= h_count ) ih = h_count - 1;
  295.                 if( jh != ih )
  296.                 {
  297.